package com.example.mydesignmodule.yuanxing.yuanxing2;

import androidx.annotation.NonNull;

import java.util.ArrayList;

/**
 * @author tgw
 * @date 2021/2/25
 * @describe
 */
public class Shape implements Cloneable {
    private ArrayList<String> arrayList = new ArrayList<>();
    private String name;
    private String age;
    private String copy;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getCopy() {
        return copy;
    }

    public void setCopy(String copy) {
        this.copy = copy;
    }

    public ArrayList<String> getArrayList() {
        return arrayList;
    }

    public void setArrayList(String s) {
        this.arrayList.add(s);
    }

    @Override
    public String toString() {
        return "Shape{" +
                "arrayList=" + arrayList.toString() +
                ", name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", copy='" + copy + '\'' +
                '}';
    }

    @NonNull
    @Override
    protected Shape clone() throws CloneNotSupportedException {
        /**浅拷贝：

         1、当类的成员变量是  基本数据类型   时，浅拷贝会复制该属性的值赋值给新对象。
         2、当成员变量是引用数据类型时，浅拷贝复制的是引用数据类型的地址值。这种情况下，
         当拷贝出的某一个类修改了引用数据类型的成员变量后，会导致所有拷贝出的类都发生改变。

         深拷贝：
         深拷贝不仅会复制成员变量为基本数据类型的值，给新对象。还会给是引用数据类型的成员变量申请储存空间，
         并复制引用数据类型成员变量的对象。这样拷贝出的新对象就不怕修改了是引用数据类型的成员变量后，
         对其它拷贝出的对象造成影响了。*/
        Shape shapeClone = null;
        shapeClone = (Shape) super.clone();
        shapeClone.arrayList = (ArrayList<String>) this.arrayList.clone(); //因为 浅拷贝 只是参数地址引用 ，所以 list 也需要拷贝 克隆
        return shapeClone;
    }
}
